﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CommandGraph.Model
{
    public class EntityCancelArgs
    {
        /// <summary>
        /// Отменить ли обработку события?
        /// </summary>
        public bool Cancel { get; set; }
        /// <summary>
        /// Элемент графа, который участвует в данном событии
        /// </summary>
        public GraphEntityBase Entity { get; private set; }

        public EntityCancelArgs(GraphEntityBase entity)
        {
            Entity = entity;
        }
    }

    /// <summary>
    /// Описывает метод, который обрабатывает событие, связанное с элементом графа
    /// и которое может быть отменено
    /// </summary>
    /// <param name="sender">Источник события</param>
    /// <param name="e">Информация о событии</param>
    public delegate void EntityCancelEventHandler(object sender, EntityCancelArgs e);

    public class EntityEventArgs
    {
        /// <summary>
        /// Элемент графа, который участвует в данном событии
        /// </summary>
        public GraphEntityBase Entity { get; private set; }

        public EntityEventArgs(GraphEntityBase entity)
        {
            Entity = entity;
        }
    }

    /// <summary>
    /// Описывает метод, который обрабатывает событие, связанное с элементом графа
    /// </summary>
    /// <param name="sender">Источник события</param>
    /// <param name="e">Информация о событии</param>
    public delegate void EntityEventHandler(object sender, EntityEventArgs e);

    public class CanAttachEventArgs
    {
        /// <summary>
        /// Отменить ли обработку события?
        /// </summary>
        public bool Cancel { get; set; }
        /// <summary>
        /// Элемент графа, к которому присоединяется переход
        /// </summary>
        public GraphEntityBase Entity { get; private set; }
        /// <summary>
        /// Редактируемый переход
        /// </summary>
        public Transition Transition { get; private set; }

        public CanAttachEventArgs(GraphEntityBase entity, Transition transition)
        {
            Entity = entity;
            Transition = transition;
        }
    }

    /// <summary>
    /// Описывает метод, который обрабатывает событие запроса разрешения
    /// присоединения перехода к элементу графа
    /// </summary>
    /// <param name="sender">Источник события</param>
    /// <param name="e">Информация о событии</param>
    public delegate void CanAttachEventHandler(object sender, CanAttachEventArgs e);

    public class CanAddEntityEventArgs
    {
        /// <summary>
        /// Отменить ли обработку события?
        /// </summary>
        public bool Cancel { get; set; }
        /// <summary>
        /// Элемент графа, который добавляется
        /// </summary>
        public GraphEntityBase Entity { get; private set; }
        /// <summary>
        /// Элемент графа, к которому добавляется вложенный элемент (Entity)
        /// </summary>
        public GraphEntityBase ParentEntity { get; private set; }

        public CanAddEntityEventArgs(GraphEntityBase entity, GraphEntityBase parent)
        {
            Entity = entity;
            ParentEntity = parent;
        }
    }

    /// <summary>
    /// Описывает метод, который осуществляет проверку возможности вставки вершины
    /// </summary>
    /// <param name="sender">Источник события</param>
    /// <param name="e">Информация о событии</param>
    public delegate void CanAddEntityEventHandler(object sender, CanAddEntityEventArgs e);
}
